#include <stdio.h>    // 提供输入输出函数，如 printf, scanf
#include <stdlib.h>   // 提供内存管理函数，如 malloc, free

// step 1# 定义三叉树的节点结构体
typedef struct TreeNode {
    int val; // 节点值
    struct TreeNode *left, *mid, *right; // 左、中、右子节点指针
} TreeNode;

// step 2# 创建一个新节点并初始化
TreeNode* createNode(int val) {
    TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); // 分配一个新节点的内存
    node->val = val; // 设置节点的值
    node->left = node->mid = node->right = NULL; // 初始化三个子节点为空
    return node; // 返回新创建的节点
}

// step 3# 向三叉树中插入一个新值
TreeNode* insert(TreeNode* root, int val) {
    if (root == NULL) {
        return createNode(val); // 若当前节点为空，创建新节点作为插入点
    }
    if (val < root->val - 500) {
        root->left = insert(root->left, val); // 小于 val-500 插入左子树
    } else if (val > root->val + 500) {
        root->right = insert(root->right, val); // 大于 val+500 插入右子树
    } else {
        root->mid = insert(root->mid, val); // 在 val±500 范围内，插入中间子树
    }
    return root; // 返回当前（根）节点
}

// step 4# 计算树的最大高度
int getHeight(TreeNode* root) {
    if (root == NULL) {
        return 0; // 空节点高度为 0
    }
    int leftHeight = getHeight(root->left); // 获取左子树高度
    int midHeight = getHeight(root->mid);   // 获取中间子树高度
    int rightHeight = getHeight(root->right); // 获取右子树高度

    int maxHeight = leftHeight > midHeight ? leftHeight : midHeight; // 取左/中最大高度
    maxHeight = maxHeight > rightHeight ? maxHeight : rightHeight; // 再和右子树比较
    return maxHeight + 1; // 当前节点高度为子树最大高度 + 1
}

int main() {
    // step 5# 读取输入并构建三叉树
    int N, num;
    scanf("%d", &N); // 输入要插入的节点数量
    TreeNode* root = NULL; // 初始化根节点为空
    for (int i = 0; i < N; ++i) {
        scanf("%d", &num); // 读取一个节点值
        root = insert(root, num); // 插入该值到树中
    }

    // step 6# 获取并输出树的高度
    int height = getHeight(root); // 计算整棵树的高度
    printf("%d\n", height); // 输出树的高度
    return 0; // 正常结束程序
}
